package convert

import (
	"errors"
	"fmt"
	"reflect"
	"strconv"
)

// Err  : 转换异常信息
//
// -------------------
//
// *** author: whmmm ***
//
// *** date: 2021-12-15 11:54 ***
type Err struct {
	SrcType string
	Target  string
	Err     error
}

func (e *Err) Error() string {
	return ""
}

func newConvertErr(src string, target string) *Err {
	err := &Err{}
	err.SrcType = src
	err.Target = target
	if err.SrcType == "" {
		err.SrcType = "未知类型"
	}

	err.Err = errors.New(fmt.Sprintf("%v 类型 暂未实现转换为 %v 方法", err.SrcType, err.Target))
	return err
}

// ToStr : 转换成字符串
//
// 支持的类型 int , uint
func ToStr(object interface{}) (string, error) {
	switch object.(type) {
	case int:
		return strconv.Itoa(object.(int)), nil
	case uint:
		return strconv.Itoa(int(object.(uint))), nil
	default:
		typeName := reflect.TypeOf(object).Name()
		return "", newConvertErr(typeName, "字符串")
	}
}

// ToUint64 : 转换成 uint64
//
// 支持的类型 string
func ToUint64(object interface{}) (uint64, error) {
	switch object.(type) {
	case string:
		return strconv.ParseUint(object.(string), 10, 64)
	default:
		typeName := reflect.TypeOf(object).Name()
		return 0, newConvertErr(typeName, "uint")
	}
}

// ToUint : 转换成 uint
//
// 支持的类型 string
func ToUint(object interface{}) (uint, error) {
	in, err := ToUint64(object)
	return uint(in), err
}
